home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtbuffer.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  5.5 KB  |  172 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtBuffer;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31.  
  32. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  33. (*                                              *)
  34. (*$R-   Range-Checks                            *)
  35. (*$S-   Stack-Check                             *)
  36. (*                                              *)
  37. (*----------------------------------------------*)
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  47.  
  48.  
  49.  
  50.  
  51. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  52.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  53.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  54.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  55.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  56.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  57.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  58.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. FROM SYSTEM     IMPORT  ADDRESS, ADR, TSIZE;
  66.  
  67. CONST   cMax =          07FFFH;
  68.  
  69. TYPE    INFO =          POINTER TO ARRAY [0..cMax] OF LOC;
  70.  
  71. TYPE    ENTRY =         POINTER TO Entry;
  72.         Entry =         RECORD
  73.                          addr: INFO;
  74.                          size: sCARDINAL;
  75.                          next: ENTRY;
  76.                         END;
  77.  
  78. TYPE    BUFFER =        POINTER TO Buffer;
  79.         Buffer =        RECORD
  80.                          start: ENTRY;
  81.                          end:   ENTRY;
  82.                          entry: lCARDINAL;
  83.                         END;
  84.  
  85. PROCEDURE Copy (from, to: INFO; size: sCARDINAL);
  86. VAR c: sCARDINAL;
  87. BEGIN
  88.  FOR c:= 0 TO size DO to^[c]:= from^[c]; END;
  89. END Copy;
  90.  
  91. PROCEDURE NewBuffer (VAR buffer: BUFFER): BOOLEAN;
  92. BEGIN
  93.  ALLOCATE (buffer,  TSIZE(Buffer));  
  94.  IF buffer = NIL THEN RETURN FALSE; END;
  95.  buffer^.start:= NIL;  buffer^.end:= NIL;  buffer^.entry:= LONG (0);
  96.  RETURN TRUE;
  97. END NewBuffer;
  98.  
  99. PROCEDURE DisposeBuffer (VAR buffer: BUFFER);
  100. VAR p: ENTRY;
  101. BEGIN
  102.  IF buffer # NIL THEN
  103.   WITH buffer^ DO
  104.    WHILE start # NIL DO
  105.     p:= start^.next;
  106.     DEALLOCATE (start^.addr, 0);  
  107.     DEALLOCATE (start, 0);  
  108.     start:= p;
  109.    END;
  110.   END;
  111.   DEALLOCATE (buffer, 0);  
  112.  END;
  113. END DisposeBuffer;
  114.  
  115. PROCEDURE BufferEmpty (buffer: BUFFER): BOOLEAN;
  116. BEGIN
  117.  IF buffer = NIL THEN  RETURN FALSE;  END;
  118.  RETURN buffer^.start = NIL;
  119. END BufferEmpty;
  120.  
  121. PROCEDURE BufferEntries (buffer: BUFFER): lCARDINAL;
  122. BEGIN
  123.  IF buffer = NIL THEN  RETURN LONG (0);
  124.                  ELSE  RETURN buffer^.entry;
  125.  END;
  126. END BufferEntries;
  127.  
  128. PROCEDURE Put (buffer: BUFFER; info: ARRAY OF LOC): BOOLEAN;
  129. VAR p: ENTRY;
  130. BEGIN
  131.  IF buffer = NIL THEN  RETURN FALSE;  END;
  132.  ALLOCATE (p,  TSIZE(Entry));  
  133.  IF p = NIL THEN  RETURN FALSE;  END;
  134.  p^.size:= HIGH (info);
  135.  p^.next:= NIL;
  136.  ALLOCATE (p^.addr,  LONG(p^.size));  
  137.  IF p^.addr = NIL THEN  DEALLOCATE (p, 0);   RETURN FALSE;  END;
  138.  Copy (ADR(info), p^.addr, p^.size);
  139.  WITH buffer^ DO
  140.   IF end # NIL THEN
  141.    end^.next:= p;  end:= p;
  142.   ELSIF start # NIL THEN
  143.    start^.next:= p;  start:= p;
  144.   ELSE
  145.    start:= p;  end:= p;
  146.   END;
  147.   INC (entry);
  148.  END;
  149.  RETURN TRUE;
  150. END Put;
  151.  
  152. PROCEDURE Get (buffer: BUFFER; VAR info: ARRAY OF LOC): BOOLEAN;
  153. VAR p: ENTRY;
  154. BEGIN
  155.  IF buffer = NIL THEN  RETURN FALSE;  END;
  156.  WITH buffer^ DO
  157.   IF start = NIL THEN  RETURN FALSE;  END;
  158.   p:= start;
  159.   IF HIGH (info) < p^.size THEN  RETURN FALSE;  END;
  160.   Copy (p^.addr, ADR (info), p^.size);
  161.   start:= p^.next;
  162.   DEALLOCATE (p^.addr, 0);  
  163.   DEALLOCATE (p, 0);  
  164.   IF start = NIL THEN  end:= NIL;  END;
  165.   DEC (entry);
  166.  END;
  167.  RETURN TRUE;
  168. END Get;
  169.  
  170. END mtBuffer.
  171.  
  172.